{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# MLP实验（MNIST & CIFAR-10）\n",
    "#本实验将使用多层感知机（MLP）模型对MNIST和CIFAR-10数据集进行分类任务，分析其表现并进行可视化。"
   ],
   "id": "9a636d11c3dacc72"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-11T00:36:31.559935Z",
     "start_time": "2025-06-11T00:36:28.422821Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ],
   "id": "9b1177c274e937b9",
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 加载数据集",
   "id": "c4169a942dd59ca1"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-11T00:36:32.941954Z",
     "start_time": "2025-06-11T00:36:31.564942Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def load_mnist():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5,), (0.5,))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def load_cifar10():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def dataset_to_numpy(dataset, flatten=True):\n",
    "    X = []\n",
    "    y = []\n",
    "    for img, label in dataset:\n",
    "        arr = img.numpy()\n",
    "        if flatten:\n",
    "            arr = arr.flatten()\n",
    "        else:\n",
    "            arr = arr.transpose(1, 2, 0)\n",
    "        X.append(arr)\n",
    "        y.append(label)\n",
    "    X = np.array(X)\n",
    "    y = np.array(y)\n",
    "    return X, y\n",
    "\n",
    "mnist_train, mnist_test = load_mnist()\n",
    "cifar_train, cifar_test = load_cifar10()\n",
    "print(f\"MNIST训练集样本数: {len(mnist_train)}，测试集样本数: {len(mnist_test)}\")\n",
    "print(f\"CIFAR-10训练集样本数: {len(cifar_train)}，测试集样本数: {len(cifar_test)}\")"
   ],
   "id": "603be82d35271f2e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST训练集样本数: 60000，测试集样本数: 10000\n",
      "CIFAR-10训练集样本数: 50000，测试集样本数: 10000\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据预处理",
   "id": "dd7cd31006eb3648"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-11T00:36:44.741050Z",
     "start_time": "2025-06-11T00:36:33.163637Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# MNIST\n",
    "X_train_m, y_train_m = dataset_to_numpy(mnist_train)\n",
    "X_test_m, y_test_m = dataset_to_numpy(mnist_test)\n",
    "# CIFAR-10\n",
    "X_train_c, y_train_c = dataset_to_numpy(cifar_train)\n",
    "X_test_c, y_test_c = dataset_to_numpy(cifar_test)\n",
    "# 只取部分样本\n",
    "n_samples = 2000  # MLP较慢，减少样本数\n",
    "X_train_m, y_train_m = X_train_m[:n_samples], y_train_m[:n_samples]\n",
    "X_test_m, y_test_m = X_test_m[:500], y_test_m[:500]\n",
    "X_train_c, y_train_c = X_train_c[:n_samples], y_train_c[:n_samples]\n",
    "X_test_c, y_test_c = X_test_c[:500], y_test_c[:500]\n",
    "# 标准化\n",
    "scaler_m = StandardScaler().fit(X_train_m)\n",
    "X_train_m = scaler_m.transform(X_train_m)\n",
    "X_test_m = scaler_m.transform(X_test_m)\n",
    "scaler_c = StandardScaler().fit(X_train_c)\n",
    "X_train_c = scaler_c.transform(X_train_c)\n",
    "X_test_c = scaler_c.transform(X_test_c)"
   ],
   "id": "27c5ccd929a46a7e",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# MLP模型训练与评估",
   "id": "24ce0a169e71de23"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-11T00:36:46.697160Z",
     "start_time": "2025-06-11T00:36:44.751574Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def train_and_evaluate(model, X_train, y_train, X_test, y_test):\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    acc = accuracy_score(y_test, y_pred)\n",
    "    cm = confusion_matrix(y_test, y_pred)\n",
    "    return acc, cm, y_pred\n",
    "\n",
    "# MNIST\n",
    "mlp_mnist = MLPClassifier(max_iter=20)\n",
    "acc_m, cm_m, y_pred_m = train_and_evaluate(mlp_mnist, X_train_m, y_train_m, X_test_m, y_test_m)\n",
    "print(f\"MNIST MLP准确率: {acc_m:.3f}\")\n",
    "# CIFAR-10\n",
    "mlp_cifar = MLPClassifier(max_iter=20)\n",
    "acc_c, cm_c, y_pred_c = train_and_evaluate(mlp_cifar, X_train_c, y_train_c, X_test_c, y_test_c)\n",
    "print(f\"CIFAR-10 MLP准确率: {acc_c:.3f}\")"
   ],
   "id": "116e8776b38fcd0c",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\python\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (20) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST MLP准确率: 0.904\n",
      "CIFAR-10 MLP准确率: 0.340\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\python\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (20) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 可视化分析",
   "id": "e2d42d957d099719"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-11T00:36:47.024391Z",
     "start_time": "2025-06-11T00:36:46.723633Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 准确率柱状图\n",
    "plt.figure(figsize=(5,4))\n",
    "plt.bar(['MNIST', 'CIFAR-10'], [acc_m, acc_c])\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('MLP在不同数据集上的准确率')\n",
    "plt.show()\n",
    "# 混淆矩阵\n",
    "fig, axes = plt.subplots(1,2, figsize=(12,5))\n",
    "axes[0].imshow(cm_m, cmap=plt.cm.Blues)\n",
    "axes[0].set_title('MNIST 混淆矩阵')\n",
    "axes[1].imshow(cm_c, cmap=plt.cm.Blues)\n",
    "axes[1].set_title('CIFAR-10 混淆矩阵')\n",
    "for ax in axes:\n",
    "    ax.set_xlabel('Predicted')\n",
    "    ax.set_ylabel('True')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "id": "a8897c85d407a10f",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22312 (\\N{CJK UNIFIED IDEOGRAPH-5728}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25454 (\\N{CJK UNIFIED IDEOGRAPH-636E}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19978 (\\N{CJK UNIFIED IDEOGRAPH-4E0A}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAF0CAYAAACnqankAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAlR0lEQVR4nO3dfVRVdb7H8Q+cIw9GFCiSaeJNRxQkIii5DY0JSknOpE56NQtrdKzm+jBzb02iyYPmGKbTNFo+dGVpK0aLq+H4EBmh1VSjd0gFnAtXGyvL0aEZGFOePMD9w8WZzvBDOYBskfdrLdZi//Zv7/09h33Oh98+++zt0djY2CgAAODC0+oCAAC4EhGQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkLiiPfzwwwoNDdWUKVNa7POzn/1MoaGhmj9/viQpPj7e+XtL5s+fr9DQUJef8PBwxcXF6amnntKf//znDn0cALoeu9UFAJfi6empQ4cO6dSpU7rhhhtc5lVVVWnv3r1tWm9QUJBWr17tnHY4HDp+/LhWrFihgwcPaufOnfLx8ZEkbd68WV988UWL6xowYICmTp3qnD59+rTWr18vLy8vY/+6ujrNmjVLwcHBzja20bW3gasPAYkrXlhYmI4dO6a8vDw98sgjLvP27t0rX19f+fv7u71eLy8v3XrrrS5tMTEx6tGjh55++mm9++67uu+++yRJISEhF30z/Oijj1yma2pq9Oijj6p///7G/l9++aVqampc2thG194Grj4cYsUVr2fPnho5cqTy8vKazdu9e7fuuece2e0d979eRESEJOmrr77qsHUC6HoISHQJSUlJzsOsTc6ePav3339f48aN69BtHT9+XNKFQ2gAui8CEl3C3XffLV9fX5dR5DvvvKNevXopOjq6zet1OBzOn8rKSn3wwQdatmyZ+vfvr7vvvrsDKgfQVfEZJLoEHx8fxcfHu3wOuWvXLo0dO1YeHh5tWudXX32l8PDwZu2RkZFavHix8wQdAN0TAYkuY+zYsZo9e7ZOnTolb29vffzxx/rpT3/a5vUFBQVpzZo1zmkvLy/dcMMNuu666zqgWgBdHQGJLuN73/uerrnmGuXl5alnz57q37+/hg8f3ub1eXl5OU/IAYB/RkCiy/Dy8tLo0aP19ttvy8fHx/kVDAC4HAhIdClJSUl67LHH5OnpqWeeeabFfseOHdPGjRubtd9222265ZZbLmOFAK4WBCS6lDvvvFP+/v7q27evBg0a1GK/4uJiFRcXN2ufN29emwKypKREH3zwQYvzAwICdOedd7q0rVu3Tn5+fsb+Z8+e1cyZM9nGVbYNXF08GhsbG60uAgCAKw3fgwQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCg23wPsqGhQQ6HQ56enm2+uDUAoGtrbGxUQ0OD7Ha7PD0vPkbsNgHpcDiMXxwHAHQ/ERER8vLyumifbhOQTf8pREREyGazWVxN91NfX6/i4mKef3R7vBas1fT8X2r0KHWjgGw6rGqz2dgpLcTzD1zAa8FarfmojZN0AAAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgINFpfH19rS4BAFqNgHRTfUOj1SV0STabTWFhYVycuQ3Y5wBrdJu7eXQUm6eH5m05qGN/OWt1KegGBvfx04tToqwuA+iWCMg2OPaXszpy8ozVZQAALiMOsQIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYEBAAgBgQEACAGBAQAIAYGBpQNbW1mrBggWKiYlRXFycsrKyWuz7zjvvaOzYsYqKitLUqVN15MiRTqwUANDdWBqQy5cvV0lJiTZt2qS0tDStXr1aeXl5zfodPXpU//mf/6nHHntM27dv17Bhw/TYY4+purragqoBAN2BZQFZVVWlnJwcLVy4UOHh4RozZoxmzpyp7OzsZn0//PBDDR48WOPHj9eAAQP0H//xHyovL9exY8csqBwA0B1YFpClpaVyOByKiopytkVHR+vw4cNqaGhw6Xv99dfr2LFjKiwsVENDg7Zt2yY/Pz8NGDCgs8sGAHQTdqs2XF5eroCAAHl5eTnbevfurdraWlVWViowMNDZnpSUpIKCAj344IOy2Wzy9PTUunXrdN1111lROgCgG7AsIKurq13CUZJzuq6uzqW9oqJC5eXlSk1NVWRkpDZv3qyUlBS9+eab6tWrl1vbra+vb1fdNputXcsDbdHe/RZXjqa/JX9Ta7jzvFsWkN7e3s2CsGnax8fHpX3FihUaMmSIpk2bJklasmSJxo4dq61bt2rWrFlubbe4uLjNNfv6+iosLKzNywNtVVZWxklpV5n2vBehc1gWkMHBwaqoqJDD4ZDdfqGM8vJy+fj4yN/f36XvkSNH9PDDDzunPT09NXToUJ08edLt7UZERDAKRJcTGhpqdQnoIPX19SouLua9yCJNz39rWBaQw4YNk91u16FDhxQTEyNJKiwsVEREhDw9Xc8d6tOnjz799FOXtuPHjysiIsLt7dpsNnZKdDnss1cf3ouufJadxerr66vx48crPT1dRUVFys/PV1ZWlpKTkyVdGE3W1NRIkiZPnqw33nhDubm5+vzzz7VixQqdPHlSEyZMsKp8AMBVzrIRpCSlpKQoPT1d06dPl5+fn+bMmaPExERJUlxcnJYtW6aJEycqKSlJ586d07p163Tq1CkNGzZMmzZtcvsEHQAAWsvSgPT19VVmZqYyMzObzSsrK3OZnjRpkiZNmtRZpQEAujkuVg4AgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAgaUBWVtbqwULFigmJkZxcXHKyspqsW9ZWZmmTp2qW265Rd///vf1+9//vhMrBQB0N5YG5PLly1VSUqJNmzYpLS1Nq1evVl5eXrN+33zzjX70ox9p8ODB2rFjh8aMGaPZs2frr3/9qwVVAwC6A8sCsqqqSjk5OVq4cKHCw8M1ZswYzZw5U9nZ2c36vvnmm+rZs6fS09MVEhKiuXPnKiQkRCUlJRZUDgDoDuxWbbi0tFQOh0NRUVHOtujoaK1du1YNDQ3y9PxHdh84cEAJCQmy2WzOtq1bt3ZqvQCA7sWyEWR5ebkCAgLk5eXlbOvdu7dqa2tVWVnp0vfEiRMKDAzUokWL9N3vfleTJ09WYWFhJ1cMAOhOLBtBVldXu4SjJOd0XV2dS3tVVZXWr1+v5ORkvfLKK9q1a5dmzJiht956S3379nVru/X19e2q+9ujWKCztHe/xZWj6W/J39Qa7jzvlgWkt7d3syBsmvbx8XFpt9lsGjZsmObOnStJCgsL04cffqjt27fr8ccfd2u7xcXFba7Z19dXYWFhbV4eaKuysjJVV1dbXQY6UHvei9A5LAvI4OBgVVRUyOFwyG6/UEZ5ebl8fHzk7+/v0jcoKEg333yzS9vAgQP15z//2e3tRkREMApElxMaGmp1Cegg9fX1Ki4u5r3IIk3Pf2tYFpDDhg2T3W7XoUOHFBMTI0kqLCxURESEywk6knTrrbfqf/7nf1za/vSnP2ncuHFub9dms7FTosthn7368F505bPsJB1fX1+NHz9e6enpKioqUn5+vrKyspScnCzpwmiypqZGkjRlyhSVlZVp1apV+vzzz/Xiiy/qxIkTuv/++60qHwBwlbP0QgEpKSkKDw/X9OnTlZGRoTlz5igxMVGSFBcXp927d0uS+vXrp//6r//S3r17NW7cOO3du1fr169XcHCwleUDAK5ilh1ilS6MIjMzM5WZmdlsXllZmct0dHS0tm3b1lmlAQC6OS5WDgCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAgdsB+fTTT+v999/nSvQAgKua2xcK8PPz08KFC3X+/HklJiYqKSlJI0aMkIeHx+WoDwAAS7g9gly0aJHef/99/frXv5bdbteTTz6pu+66S0uXLtWhQ4cuQ4kAAHS+Nn0G6eHhoTvuuEOpqanKy8vTAw88oDfeeENTp05VQkKC1q1bp9ra2o6uFQCATtOma7GeO3dOe/fuVV5enn73u98pODhYjz76qJKSklReXq4VK1bowIED2rBhQ0fXCwBAp3A7IJ944gl99NFH8vf319ixY/Xqq6/qlltucc4fMmSIzpw5o4ULF3ZooQAAdCa3A7J3795at27dRU/MiYmJUU5OTruLAwDAKm5/BrlkyRJ9+umn2rVrl7Pt3//937V582bndFBQkAYNGtQxFQIAYAG3A/KFF17Q2rVr1bNnT2fbiBEj9PLLL+ull17q0OIAALCK2wG5detWvfDCC4qPj3e2JScna8WKFXr99dc7tDgAAKzidkBWV1fLz8+vWXtAQIC++eabDikKAACruR2QTRcFOHnypLPt9OnTyszMVFxcXIcWBwCAVdwOyNTUVJ0/f14JCQmKjY1VbGys7r77bjU0NCg1NfVy1AgAQKdz+2segYGB2rJli0pLS/XZZ5/Jbrdr4MCBGjx48OWoDwAAS7TpSjoOh0MBAQHy9/eXJDU2Nur48eP63//9XyUlJXVogQAAWMHtgMzPz9eiRYtUWVnZbF5QUBABCQC4Krj9GeTKlSs1ZswY7dq1S/7+/tqyZYvWrl2rfv366ac//ellKBEAgM7n9gjyxIkTWrdunQYMGKDhw4ervLxco0ePlqenp5YvX66JEydejjoBAOhUbo8g/f39VV1dLUn6l3/5F5WWlkqSbr75Zn355ZcdWx0AABZxOyBHjhypjIwMHTt2TCNGjND27dt15MgRvf766+rTp8/lqBEAgE7ndkAuXLhQISEhKikp0ejRoxUZGakHHnhA2dnZevrppy9HjQAAdDq3P4Pct2+ffv7znysgIECStGLFCqWnp8vb21s9evTo8AIBALCC2yPIjIwMVVRUuLT5+fkRjgCAq4rbATlixAjt3LlTdXV1l6MeAACuCG4fYv3rX/+ql19+WWvXrlVgYKC8vb1d5r/77rsdVhwAAFZxOyAnT56syZMnX45aAAC4YrgdkBMmTLgcdQAAcEVxOyAffvhheXh4tDj/1VdfbVdBAABcCdwOyBEjRrhMOxwOnThxQu+9956eeOKJDisMAAAruR2Qs2fPNrZv27ZNe/bs0YwZM9pdFAAAVnP7ax4tuf322/Xxxx931OoAALCU2yPIkydPNms7d+6cNmzYoH79+nVIUQAAWM3tgIyPj5eHh4caGxudJ+s0Njaqb9+++sUvftHhBQIAYAW3A/KfLwTg4eGhHj16qHfv3hc9uxUAgK7E7c8g+/Xrp3379ungwYPq16+fbrzxRmVkZGjLli2Xoz4AACzhdkC+8MILWrNmjXr27Olsu+OOO/Tyyy/rpZde6tDiAACwitsBuXXrVv3qV79SfHy8sy05OVkrVqzQ66+/3qHFAQBgFbcDsrq6Wn5+fs3aAwIC9M0333RIUQAAWM3tgLzrrru0dOlSl697nD59WpmZmYqLi+vQ4gAAsIrbAZmamqrz588rPj5esbGxio2N1ciRI1VfX6+0tLTLUSMAAJ3O7a95BAYGasuWLSorK9Px48dlt9s1cOBADR48+HLUBwCAJdwOyLq6Ov3qV79Sv379NG3aNEnSxIkTdeedd2revHnq0aNHhxcJAEBnc/sQ67PPPqv33ntPQ4cOdbb95Cc/0b59+5SZmdmhxQEAYBW3A3LPnj1asWKFoqOjnW2jR4/WsmXLtHv37g4tDgAAq7gdkI2NjaqtrTW2nz9/vkOKAgDAam4H5D333KNFixbpD3/4g6qqqlRVVaVPPvlE6enpGj169OWoEQCATud2QKakpOg73/mOpk+frujoaN12221KTk5WWFiY5s6d69a6amtrtWDBAsXExCguLk5ZWVmXXObLL79UVFSU9u/f727pAAC0mttnsfr6+uqXv/ylzpw5o88//1z19fX67LPPtGPHDo0ePVpHjhxp9bqWL1+ukpISbdq0SSdPntTTTz+tG2+8Uffee2+Ly6Snp6uqqsrdsgEAcIvbAdnk6NGjys3NVV5ens6ePatBgwZpwYIFrV6+qqpKOTk5euWVVxQeHq7w8HAdPXpU2dnZLQbkb3/7W507d66tJQMA0GpuBeRXX32l3Nxcbd++XSdOnJC/v7/Onj2rlStXKikpya0Nl5aWyuFwKCoqytkWHR2ttWvXqqGhQZ6erkd/Kyoq9PzzzysrK0vjxo1za1sAALirVQG5detW5ebm6g9/+IP69Omj+Ph4JSYm6vbbb1dkZKSGDBni9obLy8sVEBAgLy8vZ1vv3r1VW1uryspKBQYGuvR/7rnnNGHCBH3nO99xe1vfVl9f367lbTZbu5YH2qK9+y2uHE1/S/6m1nDneW9VQC5cuFAhISHKzMzUD37wgzYX9m3V1dUu4SjJOV1XV+fS/tFHH6mwsFA7d+5s93aLi4vbvKyvr6/CwsLaXQPgrrKyMlVXV1tdBjpQe96L0DlaFZC/+MUvtGvXLqWkpGjZsmW6++67NXr06HbdvcPb27tZEDZN+/j4ONtqamqUmpqqtLQ0l/a2ioiIYBSILic0NNTqEtBB6uvrVVxczHuRRZqe/9ZoVUBOnDhREydO1N/+9je99dZb2r17t2bPni0fHx81NDRo//79CgkJces6rMHBwaqoqJDD4ZDdfqGM8vJy+fj4yN/f39mvqKhIJ06caPYVkh//+McaP368Fi9e3OptShcOkbJToqthn7368F505XPrJJ3AwEBNmzZN06ZN06lTp7Rz507t3r1bS5Ys0apVq3T//fcrJSWlVesaNmyY7Ha7Dh06pJiYGElSYWGhIiIiXE7QueWWW7Rnzx6XZRMTE/Xss8/qu9/9rjvlAwDQam5fKKDJDTfcoJkzZ2rbtm3Ky8vTQw89pA8++KDVy/v6+mr8+PFKT09XUVGR8vPzlZWVpeTkZEkXRpM1NTXy8fFRSEiIy490YQTaq1evtpYPAMBFtTkgv23gwIGaPXu22xcrT0lJUXh4uKZPn66MjAzNmTNHiYmJkqS4uDgufg4AsEybLxTQEXx9fZWZmWm8TVZZWVmLy11sHgAAHaFDRpAAAFxtCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAAAMCEgAAAwISAAADAhIAOhkvr6+VpeAViAgAbRZfUOj1SV0OTabTWFhYbLZbFaX0iV15j5n6e2uAHRtNk8PzdtyUMf+ctbqUtANDO7jpxenRHXa9ghIAO1y7C9ndeTkGavLADoch1gBADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADAgIAEAMCAgAQAwICABADCwNCBra2u1YMECxcTEKC4uTllZWS323bdvn+6//35FRUXp+9//vt59991OrBQA0N1YGpDLly9XSUmJNm3apLS0NK1evVp5eXnN+pWWlmr27Nn64Q9/qNzcXE2ZMkXz5s1TaWmpBVUDALoDu1UbrqqqUk5Ojl555RWFh4crPDxcR48eVXZ2tu69916Xvjt37lRsbKySk5MlSSEhISooKNBbb72loUOHWlE+AOAqZ1lAlpaWyuFwKCoqytkWHR2ttWvXqqGhQZ6e/xjcTpgwQefPn2+2jm+++aZTagUAdD+WBWR5ebkCAgLk5eXlbOvdu7dqa2tVWVmpwMBAZ/ugQYNclj169Kg+/vhjTZkyxe3t1tfXt71oSTabrV3LA23R3v32cuH1ACu05/XgzrKWBWR1dbVLOEpyTtfV1bW43N/+9jfNmTNHt912mxISEtzebnFxsdvLNPH19VVYWFiblwfaqqysTNXV1VaX4YLXA6zSWa8HywLS29u7WRA2Tfv4+BiX+frrr/Xoo4+qsbFRv/71r10Ow7ZWREQE//WiywkNDbW6BOCK0Z7XQ319fasHSpYFZHBwsCoqKuRwOGS3XyijvLxcPj4+8vf3b9b/9OnTzpN0Xn31VZdDsO6w2WwEJLoc9lngHzrr9WDZ1zyGDRsmu92uQ4cOOdsKCwsVERHRbGRYVVWlmTNnytPTU6+99pqCg4M7uVoAQHdjWUD6+vpq/PjxSk9PV1FRkfLz85WVleUcJZaXl6umpkaStG7dOn3xxRfKzMx0zisvL+csVgDAZWPZIVZJSklJUXp6uqZPny4/Pz/NmTNHiYmJkqS4uDgtW7ZMEydO1Ntvv62amhpNmjTJZfkJEyboueees6J0AMBVztKA9PX1VWZmpnNk+G1lZWXO301X1wEA4HLiYuUAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGBCQAAAYEJAAABgQkAAAGFgakLW1tVqwYIFiYmIUFxenrKysFvv+8Y9/1KRJkxQZGakf/vCHKikp6cRKAQDdjaUBuXz5cpWUlGjTpk1KS0vT6tWrlZeX16xfVVWVZs2apZiYGG3btk1RUVF67LHHVFVVZUHVAIDuwLKArKqqUk5OjhYuXKjw8HCNGTNGM2fOVHZ2drO+u3fvlre3t37+859r0KBBWrhwoa655hpjmAIA0BEsC8jS0lI5HA5FRUU526Kjo3X48GE1NDS49D18+LCio6Pl4eEhSfLw8NBtt92mQ4cOdWbJAIBuxG7VhsvLyxUQECAvLy9nW+/evVVbW6vKykoFBga69B08eLDL8r169dLRo0dbvb3GxkZJUl1dnWw2W5vrttlsGnbDNfJu+yqAVrs56BrV19ervr7e6lKMeD2gM3XE66Fp2aZMuBjLArK6utolHCU5p+vq6lrV95/7XUzTqPSPf/xjW8p1MXWQpEE9270e4NIar/gjJbwe0Hk67vXwz0cqTSwLSG9v72YB1zTt4+PTqr7/3O9i7Ha7IiIi5Onp6TxUCwDoXhobG9XQ0CC7/dLxZ1lABgcHq6KiQg6Hw1loeXm5fHx85O/v36zv119/7dL29ddfq0+fPq3enqenZ7NRKAAALbHsJJ1hw4bJbre7DJcLCwudo7xvi4yM1MGDB53HjBsbG/XJJ58oMjKyM0sGAHQjlgWkr6+vxo8fr/T0dBUVFSk/P19ZWVlKTk6WdGE0WVNTI0m69957debMGS1dulTHjh3T0qVLVV1drbFjx1pVPgDgKufR2JpTeS6T6upqpaena8+ePfLz89OMGTP0yCOPSJJCQ0O1bNkyTZw4UZJUVFSktLQ0ffrppwoNDVVGRobCwsKsKh0AcJWzNCABALhScbFyAAAMCEgAAAwISAAADAhIGIWGhio0NFQnT55sNm/z5s0KDQ3VqlWrJEmrVq3S8OHDjZf+i4+P17Zt2yRJ+/fvV2hoqMv8nTt3asKECYqIiNCIESM0b948ff7555KkL7/80lmH6efhhx/u6IeNbuzvf/+7nnvuOcXHxysyMlJjx47Vxo0bnVdcmT9/vubPn+/s39J++eSTT7qsNz4+XqNGjWp2aTPT/h0eHq64uDgtWbKk1VcK++1vf2t8LWzcuFF33XWXoqKitGDBAlVXV7v7lHR7ll0oAFe+Hj16qKCgQA899JBLe35+frOrEZ0/f14ZGRl67bXXWr3+/Px8paWlKSMjQ5GRkTpz5ozWrFmjhx56SG+99Zb69u2r3/3ud87+DzzwgH70ox8pKSnJWR/QESoqKvRv//Zv6tOnj5YuXar+/furuLhYS5Ys0YkTJ7Ro0SLjcqtWrXK54YLkeiWwgwcPqqamRjU1Ndq/f79iY2ObrSMnJ0d9+/aVdOEeuQcOHFBaWpoCAgI0e/bsi9b9+9//XqmpqYqIiHBpf/vtt7V69Wo9//zz6tWrl1JSUvT8888rNTW1Vc8HLiAg0aKYmJhmAXn27FkdPHiw2VdsgoODdfDgQeXm5mr8+PGtWn9ubq4mTpyocePGOdtWrlyp2NhYvffee7rvvvsUFBTknGez2XTttde6tAEdYeXKlfLy8tKGDRvk7e0tSbrpppvk4+Ojn/zkJ83+SWxy3XXXXXR/3LVrl2JiYnT+/Hnl5uYaAzIwMNBlHf3799cnn3yi/Pz8iwbk6tWrtW7dOg0cOLDZvFdffVXTp0/XqFGjJEkZGRmaMWOGnnrqKfn6+ra4TrjiECtalJCQoAMHDujs2bPOtn379ikmJkbXXHONS9+QkBA99NBDWr58uc6cOdOq9Xt6eurw4cM6d+6cs83b21u5ubkaOXJkxzwI4BLq6uq0a9cuTZs2zRmOTUaNGqWNGzeqX79+bq+3oaFBeXl5iomJ0ahRo/T222+3+ibvXl5el7zr0IcffqgNGzYoMTHRpb2+vl7FxcWKiYlxtt166606f/68SktL3X4c3RkBiRYNGTJEwcHBev/9951t77zzjkaPHm3sP2fOHNntdq1cubJV63/wwQdVUlKi733ve/rZz36mnJwcnT59WiEhIfLz8+uQxwBcyhdffKGqqqpmhymlC/eejY2NbdN1nPfv36/y8nKNGjVKo0aNUk1Njfbs2XPRZRobG7V//37t2LFD99xzz0X7bt68WXfccUez9jNnzqi2ttblWtV2u13XX3+9Tp065fbj6M4ISFxUQkKCCgoKJF34T/vDDz9UQkKCsa+fn59SUlL0xhtvqKio6JLrjo2NVXZ2tmJjY1VQUKBnnnlGo0aN0uLFi1t1KxqgIzQd8bj22mvdXvbHP/6xoqKinD/x8fHOeTt37lRoaKhuuukmBQUF6dZbb9Wbb77ZbB3jxo1zLj98+HA9+eSTSk5O1owZM9r0eJou0dneWwSCzyBxCQkJCZo7d64cDoc+/vhjDRkyRL169Wqx/9ixY/Xf//3fSk9PV05OziXXHxUVpZdeesl5ckJubq6ys7M1YMAA52UHgcvp+uuvl3ThLFZ3Pfvssy43TWi60UJdXZ3eeecdl88uExMTlZmZqZMnT+rGG290tq9fv17BwcE6efKkFi9erKFDh+rxxx93HmJNTU3Vjh07nP137drlsvw/azpMbLpFIJ8/uocRJC4qOjpa0oU7reTn52vMmDGXXCY1NVXHjh3Tb37zmxb7nDt3TosXL3Ye8vH29tZdd92llStXKikpSR999FHHPADgEgYMGKBrr71WR44cMc5/4oknWtwfg4ODFRIS4vy56aabJEkffPCB/v73v2vNmjUKCwtTWFiYli9frsbGRm3fvt1lHTfeeKNCQkL0r//6r1q3bp327dunzMxM5/x58+YpNzfX+XOp2/xdf/318vb2drlFoMPhUGVlJSe4uYmAxEXZ7XaNHDlSBQUF2rt3b4ufP35bSEiIZs2apRdffNHlBJ9v8/Hx0Y4dO5SXl9ds3rXXXqvAwMB21w60ht1uV1JSkrKzs5uNugoKClRQUODWvWclaffu3br55pu1fft2Z7Bt375dt99+u3Jzc1tcbsCAAZozZ45ee+01HT58WJLUq1cvlxC+1I1+PT09FRERocLCQmfboUOHZLfbNXToULceR3dHQOKSEhISlJOTo169ejn/Q76UWbNmKTAwsMXDVjabTY8//rh++ctfav369frTn/6k//u//9PGjRu1Y8eOFk+rBy6HOXPm6OzZs5oxY4YOHDigL774Qjk5OZo/f76Sk5M1ePDgVq+rurpaBQUFeuCBBzRkyBCXn2nTpumzzz7TwYMHW1w+OTlZgwYNatdn8Q8++KA2bNig/Px8FRUVKT09XZMnT+YQq5v4DBKXFBcXJ4fD0arRYxMvLy+lpqZe9ESDGTNm6LrrrtPmzZu1Zs0aSdLw4cP1yiuvaPjw4e2uG2itoKAgbd68WatWrdKTTz6pyspKDRgwQHPnztXUqVPdWldBQYHOnz9v/D7w6NGjFRQUpDfffFOzZs0yLm+32/XMM8/okUce0datWzVp0iS3H899992nr776Sqmpqaqrq1NiYqKeeuopt9fT3XG7KwAADDjECgCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgAEBCQCAAQEJAIABAQkAgMH/A0YXOPV2gW76AAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_8100\\2410627482.py:16: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) Arial.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_8100\\2410627482.py:16: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) Arial.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_8100\\2410627482.py:16: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) Arial.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_8100\\2410627482.py:16: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) Arial.\n",
      "  plt.tight_layout()\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) Arial.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBYAAAHqCAYAAACwSs1vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABAnklEQVR4nO3de5zc870/8PfMbJJduamIVqJCKlKXuCZulYrQUnVUL8eJtiH0SKnWoUcbgqBpRaTV/irFT8nhlB/qUqUUdaiK5jh1iUqJigTVKFGSI7fd7Mz8/tDdils23/2M7073+Xw88mB3Zt7znu98L+95zXdmC9VqtRoAAAAAGRTzbgAAAACoX4IFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBXgb48ePj+HDh8e4cePe8TonnXRSDB8+PE455ZT2340dOzZ22WWXWLx48dveZvjw4XHBBRe0/3zKKafE2LFj17rOypUr44ILLoiDDjoodthhh9h1111j3Lhxcd1110W1Wo2IiOeffz6GDx++zn8PPPBAZxYDANBNPPbYY/GNb3wjxowZEzvssEPsv//+ccYZZ8Sf/vSnta53wQUXxPDhw9t/XtdMcvDBB691+0qlEmPGjInhw4fHvHnz3raXsWPHvqXONttsE6NGjYrPf/7z8Zvf/Ga9Hltra2scdthha81gbVasWBFnn312fOQjH4mdd945jjnmmFi4cOF61QciGvJuALqqYrEYc+fOjb/85S/xgQ98YK3LVq5cGffcc8/b3m7FihVx+umnx6xZs9b7PqvVahx77LGxcOHCmDhxYgwbNiyam5tj9uzZccYZZ8RTTz0VkydPjk022SSuvfba9tstWbIkvvrVr8Zxxx0XY8aMaf/9Vltt9Y73NX369HftZe+9946PfOQj7T/ff//9MXv27He9zaRJk97z+wAAOueqq66Kc845J3bffff493//99hkk03i2WefjcsuuyzuvPPOuOKKK+LDH/7wu9Z48wzSprGxca2f77///nj55Zdj6NChcc0118S3v/3tt623zz77xFe+8pX2n1tbW+O5556LSy65JL7yla/E9ddfv86eIiKam5vjm9/8Zjz66KMxevTot1z+7//+7/Hoo4/GN77xjejTp0/MnDkzjjjiiLj11lujf//+71j3tttui8cee+wdL+/fv38ce+yx7T+Xy+U466yzok+fPu94m4MOOihGjBjxnt4HpCJYgHew7bbbxoIFC+L222+PCRMmrHXZPffcE01NTdGvX7+33K5fv35x//33x09/+tM47LDD1us+H3rooXjggQdi1qxZa73gHjNmTBSLxbjyyivjmGOOiYEDB8ZOO+3Ufvnzzz8fERGbb775Wr9/N6NHj4699trrHS//7W9/u9bPhULhXV/Uv/n679V9AADZPfTQQ/Gd73wnvvCFL8Rpp53W/vvdd9899t9//zj00ENj8uTJceONN75rnY7OIDfeeGPsvPPOMXr06LjooovilFNOedsXwhtttNFb6o0cOTJ23HHHOOigg+Lmm29eZ7Dw4IMPxre+9a148cUX3/byRx55JO6555645JJLYp999mm/j/322y/+3//7f3Hccce9Y+0NN9xwvWaWarUaBx98cOy+++4dvs17cR+Qio9CwDvYYIMNYp999onbb7/9LZfddtttccABB0RDw1uzubFjx8Zuu+0W06dPjxdeeGG97nPJkiUR8fppgm/2+c9/Pk466aQoFArrVRMA4J1cdtll0bdv3/j617/+lss22mijOOWUU2K//faLlStXdvq+li1bFnfddVfsu+++cfDBB8eqVavi5z//+XrVaHtTpyPz0HHHHReDBg16x1Bk9uzZscEGG8Tee+/d/ruNNtooRo0aFffee+969QXdnWAB3sVBBx3U/nGINsuXL4/f/OY3b/nMYJtCoRDnnHNOVCqVOP3009fr/nbbbbfYYIMN4utf/3rMmDEjHnjggVi9enVERGyxxRZxzDHHxMYbb5z9AQEA/E21Wo3Zs2fHnnvuGU1NTW97nYMOOiiOP/742GCDDd61VqVSidbW1rX+lcvlta5zyy23RLlcjn/6p3+KQYMGxR577LHWRzvf3Nsba61atSrmz58fkyZNih49erzjHPZGV155ZVx88cUxePDgt7386aefjs022yxKpdJav998881j0aJF66wP/J1gAd7FmDFjoqmpaa2zFn71q1/FgAEDYtddd33H233wgx+Mr3/96zF79uy47rrrOnx/AwYMiB//+MfRv3//uPTSS+OII46IkSNHxhe/+MX46U9/+pYDNABAVq+++mo0NzfHZptt1ulap512Wmy33XZr/XvzRxluvPHG+OhHPxoDBw6MiIjPfOYz8eSTT8bDDz/8lno33XTTW2p99rOfjRUrVsRll10W22yzzTp7euOXTL6d11577W0/htG7d+9YsWLFOusDf+c7FuBdNDY2xtixY9f6noVbb701PvGJT6zzFLwvfvGLcccdd8S5554bo0ePfssXQL6TkSNHxp133hkPPfRQzJ49O/7nf/4n5s6dG7/73e/ipptuilmzZr3li5AAANZX2zv1Kd64+OpXv/qWL28sFv/+Hub8+fPjD3/4Q3zxi1+M//3f/42IiD322CM22GCDuPbaa2OXXXZZ67b77rtvHH/88RER8dxzz8WMGTPi/e9/f8ycObM9mGjrve2vZkW8fubom89AeCdvvN2b+egprB9nLMA6fOITn2j/OMSrr74ac+bMiU9+8pPrvF3bRyLK5fJ6fySiWCzGqFGj4qSTToqrr7467r///jj88MPjoYceiuuvvz7rQwEAaNe/f//o3bv3O/6Z7IjX/xLWsmXL1llr8ODBMWLEiLX+bbfddu2Xt80vp556aowaNSpGjRoVo0ePjpUrV8Yvf/nLt9zHhhtu2F7nk5/8ZFx66aUxf/78OOaYY6KlpaX9ehMmTFjrzIY3f+H2u+nTp8/bnpmwYsWK6Nu3b4frAM5YgHX66Ec/Gr17947bb789Nthgg9hss81i++2379BtN9988zjppJPinHPO6VAgcOKJJ8bSpUvj8ssvX+v3/fv3jylTpsRtt90WCxYsyPIwAADeYu+9944HHnggmpubo1evXm+5/Kc//WlMnz49rr/++rWCgvXR0tISt9xyS3z84x+PL37xi2td9vzzz8fkyZPjZz/72buGAltttVWccMIJcd5558XMmTPbv2zy7LPPXisc6N27d4f72nLLLWP27NlRqVTWOrvi2WefjQ996EMdrgM4YwHWqWfPnrH//vvHHXfcEb/85S87dLbCG40fPz523XXXOPfcc9d53SFDhsR///d/x9y5c99y2UsvvRQrV66Mrbfeer3uHwDgnRx99NGxdOnS+MEPfvCWy5YsWRKzZs2KrbbaKnOoEBFx9913x9KlS2PcuHGx++67r/Xvs5/9bGyxxRbv+CWOb3TkkUfG1ltvHbNmzYpnnnkmIiKGDh261lkSQ4cO7XBfe++9d6xYsSLuu+++9t+98sor8eCDD671Z7+BdRMsQAccdNBB8cgjj8QDDzyw3sFCsViMadOmxZo1a9Z53aOPPjo+9KEPxVFHHRUzZsyI3/zmN/G73/0urrrqqvjCF74Qw4YNi8985jNZHwYAwFp22mmn+Ld/+7eYNWtWTJw4MW677baYM2dO/Od//md87nOfi+bm5rcNHdbHDTfcEAMGDIg99tjjbS8/5JBDYuHChfHAAw+8a52GhoaYPHlyrFmzJs4555xO9RQRMWrUqNhtt93iG9/4Rlx33XXxq1/9KiZMmBB9+/aNww8/vNP1oTvxUQjogL322iv69esXm266aaZT44YMGRInnXRSTJs27V2v179//7j22mvjxz/+cdx9991x9dVXx5o1a2Lw4MFx8MEHx8SJE5N9ceNtt922VkL/ZjvssMNaPy9btiymT5/+jtd/7bXXYq+99nrP7wMA6Jzjjjsutt1227jqqqvinHPOiWXLlsWmm24aY8aMiWOPPTY23XTTzLVffPHFuP/++2PcuHHv+KWKn/rUp+KCCy6Ia665Jnbfffd3rbfnnnvGAQccEHfccUfcc889se+++2buLSJi5syZce6558Z5550XlUoldtlll/jBD34Q/fv3f9fbPffcc+864xQKhbfMLFdffXX8+te/fsfbjB49+j2/D0ilUH23r0MFAAAAeBc+CgEAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAILOGvBvIqlKpRGtraxSLxSgUCnm3A0Cdq1arUalUoqGhIYpFuTv1x2wEQErrMxvVbbDQ2toajz32WN5tAPAPZsSIEdGzZ8+824D1ZjYCoBY6MhvVbbDQlphMe2hNtFQ6X69nMeLUXXskq9fm6qNGpStWB8rlcjz1xGMxbJsRUSqV8m6nLtViGZYr1SR1aqlUTPfumvWw87rjMmx7zM5WoF61rbuHTn8gVraUO11vg56luGnS7snqtVlw5ZeT1aqF5c2tSetVKuV4+bk/xsabbx3FYpr96UZ9eiWpU0sta9KtM5VyOZ5Z8HhssdW2UUx0TGppTTjw10hLOV2PtVgP68XDz7+arFahWonB5Zfiz6VNolpIMy9ssWHvJHVqoVqpRPmVRR2ajeo2WGg7xa+lEtGcbr+VvF53GcjfrFQqddvHnkrSZVjoXsFCe03rYad1x2XoFHLqVdu6u7KlHCsTDjOp66V6YVgrxWJtjpnFYinZC7p62C8Xa/C6vVgqJVt/itWuv6+vRY8p18N6kSoAeHPNVHULdfB8dGQ28rYMAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADLLNVhobm6OyZMnx8iRI2PvvfeOWbNm5dkOAECuzEYA1KOGPO/8vPPOi3nz5sUVV1wRixcvjkmTJsWgQYPiwAMPzLMtAIBcmI0AqEe5BQsrV66M6667Ln784x/HdtttF9ttt1089dRTcdVVVzl4AgDdjtkIgHqV20ch5s+fH62trbHzzju3/27XXXeNRx99NCqVSl5tAQDkwmwEQL3KLVhYsmRJvO9974uePXu2/27jjTeO5ubmWLp0aV5tAQDkwmwEQL3K7aMQq1atWuvAGRHtP7e0tHS4Ts9E0UhbnVT12pTL5bQFu7i2x9vdHndKtViG5Uo1Wa2aqRaSlbIedl53XIbd6bHSNaWajTboWUrST1udVPXaVLr4tlappO2vrV7KuvWwv0r5PLfVSluz658FlPJMpVqsh/WiUE23HNtqpaxZ7cLPSXU91sHcgoVevXq95SDZ9nNjY2OH65y6a4+kfaWuN3/e3KT16sVTTzyWdwt1zzLsPMuw8yxDeO+kmo1umrR70r5S11v4ZPfcr7z83B+T1XopWaX68syCx/Nuoe6lXA/rxWY1qDm4nG4rbH05Walc5RYsvP/9749XX301Wltbo6Hh9TaWLFkSjY2N0a9fvw7XmfbQmmhJEBj1LL4eKqSq1+bqo0alK1YHyuVyPPXEYzFsmxFRKqV9h6O7qMUyrIczFkrFtGcsWA87pzsuw7bHDHlJNRsdOv2BWNnS+XfANuhZipsm7Z6sXpsFV345Wa1aWN7cmrRepVKOl5/7Y2y8+dZRLKbZn27Up1eSOrXUsibtGQvPLHg8tthq2ygmOia1tHb9MxZaEp5VUYv1sF48/PyryWoVqpUYXH4p/lzaJKqFNKe6b7Fh7yR1aqFaqUT5lUUdum5uwcI222wTDQ0NMXfu3Bg5cmRERDz00EMxYsSIKBY7/iS1VCKaE549krpedxnI36xUKnXbx55K0mVY6F7BQntN62GnWYbw3kk1G61sKcfKhMNM6nqpXhjWSrFYm2NmsVhK9oKuHvbLxRq8bi+WSsnWn2LCj2DWSi16TLke1otUAcCba6aqW/gHeT5y+/LGpqamOPTQQ+Oss86K3//+93HXXXfFrFmz4ogjjsirJQCA3JiNAKhXuZ2xEBFx6qmnxllnnRVHHnlk9OnTJ772ta/Fxz/+8TxbAgDIjdkIgHqUa7DQ1NQU06dPj+nTp+fZBgBAl2A2AqAe5fZRCAAAAKD+CRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMisIe8GOuvqo0ZFqVTqdJ1yuRzz581NVq/N+0Z9NVmtWnj1dzPzboH3QKlYyLsFAN4j//N/j4pCsfOzTLVSjqXPP5msXptv/OKJZLVq4TsHDk9ar1KuRkREz1IxiqU07+m9tmpNkjq11NJaSVarUilHRMTy5tYoFqtJavZs6Prvr/ZpTPdSrVIuxEsR0adXQxQTvtapBx/ZcuNktSrlcjz/9F9ijyEDki3HJ19YnqROTVQr0dTBq3b9LQoAAADosgQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMmvIu4F/dK/+bmbeLbyrbb95W9J6TQ2F+M9/2SR2O+POWNVaTVLz8fMOSlKnOytX0jwX9aLt8ZYr1YhCusdeD8uxVCwkqVOrZZiqP+CdtbRWopBgW6tWKknrtZlx8DbJatXCN37xRNJ6PQrVOHrLiG/d9VSsqaZZjt85cHiSOrX0wtLV6YpVK1GIiBeXNUcU0rwv2qex678Mevm1lnTFqpVoiog//Pm1ZMswImLLgRskq1UPKm37xXIliom25xEf7JekTi1UyuVY+GTHruuMBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJnlGiy8+OKLccIJJ8Ruu+0Wo0ePjmnTpkVzc3OeLQEA5MZsBEA9asjrjqvVapxwwgnRr1+/uOqqq2LZsmUxefLkKBaLMWnSpLzaAgDIhdkIgHqV2xkLCxcujLlz58a0adNi2LBhMXLkyDjhhBPiF7/4RV4tAQDkxmwEQL3KLVgYOHBgXHrppbHxxhuv9fvly5fn1BEAQH7MRgDUq9yChX79+sXo0aPbf65UKnHllVfGHnvskVdLAAC5MRsBUK9y+46FN5sxY0Y8/vjjcf3116/X7crlcpL7b6uTql69aGooJK3X+Ld6jQnrdrfnpBbrYrlSTVarHtRqe66L5VhNs+3VbJ+YqL9a6G77Grq+rLNRtZJmXW6rk6pem0oX39Z6FNLu69vqpazb1ZdhRERUK+lrJayZer2uiS6+DCMiKvWwHBNqe7wpH3el3HVno/XZ1xSq1Wruk/KMGTPiP/7jP+L73/9+HHDAAR26Tblcjrlz59a2MQC6nZ122ilKpVLebdDNmY0A6Co6MhvlfsbC1KlT4+qrr44ZM2Z0+MD5RsO2GZFkACyXy/HUE48lq1cvdjvjzqT1GhsKcclnB8bEG5bE6tY0mdX/TP14kjr1ohbrYl28055QuVyOhU/Oi6HDt0+6PdfDciwV052xUItlmKq/Wmjb9iBvnZ2NmjYZGoVi57fbaqUcq15amKxemw/0b0xWqxZOv/3JpPV6FKoxfos18ZNnesSaRGdtTdl/WJI6tfSnV1alK1atRGHpM1HdcIuIQppPcvfu1fXn/b8uX5OuWLUSTSuei1W9N0+2DCMihmzclKxWPahUyvHyc3+MjTffOoqJ9ot9euX+kvwdVcrleGbB4x26bq6PYubMmXHNNdfE+eefHwceeGCmGqVSKe3Qm7heV7cq0Yv/N1vdWk1Wuzs9H2+UdF1MfFpnvUi+PdfBckz9wj35PrYLBwvQFaSYjQrFUtIgIHW9Yhc/rqd68f92dVPV7urLMCKSvnhdq2aiuinX6Zop1OBjBgmXYUQke3Fdb4rFUrLHXhfbcwfkFiw8/fTTceGFF8bEiRNj1113jSVLlrRfNnDgwLzaAgDIhdkIgHqVW7DwX//1X1Eul+Oiiy6Kiy66aK3Lnnwy7SloAABdndkIgHqVW7AwceLEmDhxYl53DwDQpZiNAKhXNfjwEwAAANBdCBYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMisIe8GyNfccw5MWq9cLsfC+b+P2WfuH6VSKUnNo6+em6ROLc06fKe8W3hXLa2VvFtYp6aeadaXiIioFiIiolQsRKlYSFa2HpZjz4ZEeXGNliFQex/o3xjFBMfgSrkcC/+Srl6bF5auTlarFr6+95ZJ61Ur5Vj5l6fiq3sOiUIxzXJ85E9Lk9SppQ0aEr7MqFaiKSJWr6lEJDsktaYqVDP9mtItw2qlHK3LI/o2lpKthxERzXUwGw3o0zNZrUq5EC9FRJ9eDcn2i8tXd911sVIpd/i6zlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGTWkHcD5KtULKQtWC20101Ve9bhOyWpU0s7TL49Wa2mhkLM+uzGsdfZd8Wq1mqSmr8/58AkdWqppbWSrFa5XGmvWaqmW8ebepaS1aqVciXNOtNWp1ypRhTS1Hxj3a6obb2Bere8uTWKxc5va5VKOWm9NgP69ExWqxaefGF52oLVSjRFxF+Xr4kolJOU3G7Tfknq1NJfl7ckq1WtlKN1eUTfxlIUimmOxZtu2JikTi29tro1Wa1qpRBLI6JPY0OyZRgRsWBJ4u2lBvo2bpisVuUNM2Yx0YzZp7HrviSvlAvxUgev64wFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmXWZYGHixIlxyimn5N0GAECXYDYCoF50iWDh1ltvjXvvvTfvNgAAugSzEQD1JPdgYenSpXHeeefFiBEj8m4FACB3ZiMA6k1D3g1Mnz49PvWpT8VLL72UdysAALkzGwFQb3INFubMmRMPPvhg3HLLLXHWWWdlqlEul5P00lYnVb16Ua5U09arxXKsFtLVqpGmhnQ9Nv6tVmPCmvWwXpfLlWS1Kn97vJXEj7tcSLu91EKqbbpW+8TU+5yUUq8vkEWK2ahSSbMut9VJVa+9brnr7gciIqKa7ni0Vr2EdVM/J7VQTdhjtVJZ678p1MM+P+0yLCevGRFRSL291EDK57oW+8VKF54v12fZ5RYsNDc3x5lnnhlTpkyJxsbGzHWeeuKxhF2lr9ddLXxyXt4tvKdmfXbj5DUv/NSAZLXmz5ubrFY9eeapP+TdQt3rbtsy5CnVbPTyc39M2FX6el1dU63qrnguWa2XlicrVVfKryxKVuv5l5OVqivLFi9IWm+jpNVq4/mnn09ec/Gi+clr1rvcgoWZM2fG9ttvH6NHj+5UnWHbjIhSqdTpfsrlcjz1xGPJ6tWLWpyxsPDJeTF0+PbJlmOp2PXPWNjr7LuS1WpsKMSFnxoQX/n5X2N1a5rn57dn7p+kTi21tKZ9F+KZp/4QWwzbLooJt+eeDbl/Lc06pTxjIfW2HNH1z1gQRpGnVLPRxptvHcVi57fbSqUcLz/3x2T12vQsde196VMvrkhbsFqJphXPxarem0cU0jz2IRvXKv5I55XlLclqVSuVKL+yKEobbRmFYppl+IH+2cO798ry5tZktaqVcixbvCD6D9oqCgm354UvJ95eamCHwf2T1apUyrF40fwYtOWHk+0Xu/J8WSmX45kFj3fourkFC7feemu8/PLLsfPOO0dEREvL6zufO+64Ix555JEO1ymVSkmH3tT1urwanXqTcjnWQ7CwKlEA8EarW6vJ6tbDOl2qwUdeisn3D113x98u8TadfJ/YhU/3g7ylmo2KxVLSICB5va6+L0304v9t6yaqnfL5qJWUL17/XrOYrG7KNx5qpVBMf8wsFEtJn5tqrbaXhGrxXBeLpWR1u/w+sYNyCxZ+8pOfRGvr31O47373uxERcfLJJ+fVEgBAbsxGANSr3IKFwYMHr/Vz7969IyJiyJAhebQDAJArsxEA9eof47wLAAAAIBe5/rnJNzr33HPzbgEAoMswGwFQL5yxAAAAAGQmWAAAAAAyyxQslMvl+PWvfx2XX355/O///m88+uij8dprr6XuDQCgLpiNAOjO1vs7Fl544YX40pe+FEuXLo1ly5bFfvvtF5deemk88sgjcdlll8Xw4cNr0ScAQJdkNgKgu1vvMxa+9a1vxa677hr33Xdf9OzZMyIizj///Nhrr73i29/+dvIGAQC6MrMRAN3degcLDz74YBx99NFRKpXaf9ejR4/4yle+EvPmzUvaHABAV2c2AqC7W+9gobGxMf7617++5feLFi2KPn36JGkKAKBemI0A6O7WO1gYN25cTJkyJX79619HxOsHzRtuuCHOOOOM+NznPpe6PwCALs1sBEB3t95f3nj88cdHv3794qyzzopVq1bFxIkTY8CAATFhwoT40pe+VIseAQC6LLMRAN3degcLERHjx4+P8ePHx8qVK6NcLkffvn1T9wUAUDfMRgB0Z+sdLNx0003vevmhhx6asRUAgPpjNgKgu1vvYOGHP/zhWj+Xy+X461//Gg0NDbHDDjs4eAIA3YrZCIDubr2Dhbvvvvstv1uxYkVMmTIlhg8fnqQpAIB6YTYCoLvL9B0Lb9a7d+/42te+FocffnhMnDgxRckOK1eqEYVqmjoJ67UpFQvJatVC8v6qhfa6qWq3PTdd2YPf+niyWuVyORbO/338+rSxa/1N9M446MLfJqlTS7d9Za9ktcp/24Z7NhSjVFrvP37zjlpaK8lq1Uq32+ekVO3CvVF38pyNNurTK8nxo1wux0sJ67VpXlNOVqsW+jUlGY/bVSvlaF0e0bexFIVimuX4uz+9kqROLW3Wd4N0xarVKETEmnI1opLmWHz/opeT1Kmloe9L9+dqq5XXt7vlq1ujUEw3W3+gb2OyWt1Vrx7p9q+plddjjE42cc+fPz8qiTZ0AIB6ZzYCoLtY70h2/PjxUSis/a7OihUr4sknn4wJEyak6gsAoC6YjQDo7tY7WNh9993f8ruePXvGySefHHvuuWeSpgAA6oXZCIDubr2DhaVLl8YRRxwRm2++eS36AQCoK2YjALq79f6OhZtvvjmKxXRfhgYAUM/MRgB0d+t9xsKECRPi7LPPjgkTJsSgQYOiV69ea10+aNCgZM0BAHR1ZiMAursOBQu/+93vYuedd46Ghob44Q9/GBER9913X0RE+5cVVavVKBQK8cQTT9SoVQCArsFsBAB/16Fg4YgjjojZs2fHgAED4r/+679q3RMAQJdmNgKAv+tQsFCtVtv/f/DgwTVrBgCgHpiNAODvOvxNQ2/++8wAAN2Z2QgAXtfhL2/87Gc/26FvPHY6IADQHZiNAOB1HQ4WjjrqqOjbt28tewEAqBtmIwB4XYeChUKhEJ/85CdjwIABte4HAKDLMxsBwN916DsW3vgFRQAA3Z3ZCAD+rkPBwqc//eno1atXrXsBAKgLZiMA+LsOfRRi2rRpte4DAKBumI0A4O86/OcmAQAAAN5MsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkFlD3g10VrlSjShU09RJWK9NqVhIVqu76nbLsPr64y0VC8ke+y3H7pmkTi2N/8nDyWr1LFbj69tHTLxmbrRU0q0/l39h52S1aiXZ9lKD9bDLq3aTxwk5W766Ne8W3lXPhrTvu1Ur1Wj9W91CMU3tzfpukKROLf36ub8mq1WKany0T8R9f3olypFmX334DoOT1Kmlr97wWLJaPYsR39yxEOf814JoqSQrGzM/OyJdMeqaMxYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABklmuw0NLSEmeffXaMGjUq9tprrzj//POjWq3m2RIAQG7MRgDUo4Y87/zb3/52PPDAA3HZZZfFihUr4qSTTopBgwbFuHHj8mwLACAXZiMA6lFuZywsXbo0brjhhpg6dWrssMMOseeee8bRRx8djz76aF4tAQDkxmwEQL3K7YyFhx56KPr06RO77bZb++8mTpyYVzsAALkyGwFQr3ILFv70pz/F4MGD46abboqLL7441qxZE5/5zGfiuOOOi2Kx4ydSVMrlJP201UlVr0250L0+F1n+2/IrJ16OXV25ku557q7LsGcx3TLsWXzjf9M/N11atZCkTHdcD7vTY6VrSjUbpVqXa7UfqFS69rZWTdxfW72kdauVdLVqpJTw+NtWK2XNrr4eRvx9nklZK2XNiPpYjpVy+vUm5eMul7vu31NYn/1/oZrTNwJdeOGFcdlll8WwYcNi0qRJsWTJkpgyZUpMnDgxjj766HXevlwux9y5c2vfKADdyk477RSlUinvNuiGzEYAdEUdmY1yO2OhoaEhli9fHt/73vdi8ODBERGxePHiuPrqqzt08GyzxbDtophgAKyUy/HMU39IVq9Nz4aum0DVQrlcjqeeeCyGbTOiWw3mqc9YWPjkvBg6fPtutQyP+2m6zxD3LEZ8dduImY9HtCR8U+eiw3ZMV6xGSsV0Zyx0t2257TFDXlLNRqm221rtB15Z3pysVi0sX92atF61Uo5VLy2Mpk2GRqGYZjmuaO767xLf96dXktUqRTU+0mdZ3L+8f5QjzXHuc9tvmqROLZ3888eT1epZjDhxRCF+8Fg16Wz03U9tm65YjfQspXs9VqmUY/Gi+TFoyw9HMdH23KepR5I6tbA+s1FuwcLAgQOjV69e7QfOiIgtt9wyXnjhhfWqUyyVkh7sUtcrJVyR60kp8XLs8mrwkZfutgxbKmkGhddV/1Yzbd16eD5SBQvt9brZegh5SjUbpd5uU9dLNYzXSiHhR/PWrltKFizUYu5ILVUA8Oaaqep29fUwIu2bI2+smbJuPSzHYg1ejxWLpWRvRv+jzFm5verdcccdo7m5ORYtWtT+u4ULF651MAUA6C7MRgDUq9yChaFDh8aYMWPi1FNPjfnz58d9990Xl1xySRx++OF5tQQAkBuzEQD1KrePQkREfPe7342pU6fG4YcfHk1NTfGFL3whxo8fn2dLAAC5MRsBUI9yDRb69u0b5513Xp4tAAB0GWYjAOpR9/xmQQAAACAJwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJk15N1AZ/VsKEap1Pl8pFyoJq0HXUmpWMi7hXX6yfhdktUql8sxf97cuGTcTlEqlZLV3eucu5PVqpXfTh6bdwvvqqW1kncL76hc7rq9wfpY8JfXolDs/L6vWiknrddm6037JqtVC6+tbs27hXXq09j1R/jPbLtpslrVSjmWPr80Dvnw+5Oti81d+HjU5pJ/2TFZrUq5HM8//Yf44We2j2LC2ehHv30mWa1aOX6vLfJu4V09s2RF3i28o7bjQEd4BQ0AAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyKwh7wY6q1ypRhSqaeokrNemVCwkq1ULbY87db2Uy7GrL8OItMuxVutiV1cPz/N9p+ybdwvr9M1fPJGkTo9CNT6/WcSU25+MNdV0z820gz6crFZyCR8n5Ol/XnglKgneOypGJXbpka5em6037ZusVi1sumFj0nqVcjkW/iXiA/0bo1gqJam5fHVrkjq11LMh3TpTKRdiaUT06dWQbBmm7K9WevVI81gjIsrl1x9vn6YeUUq0DCMijt9ri2S1amXzj56UrNYGjT3izplfjG0/cWqsXL0mSc1HbpuepE7euv4WBQAAAHRZggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZJZrsPDCCy/El7/85dhll11i7Nixcfnll+fZDgBArsxGANSjhjzv/MQTT4xBgwbFjTfeGAsWLIiTTz45Bg8eHB/72MfybAsAIBdmIwDqUW5nLCxbtizmzp0bxx13XGyxxRax//77x+jRo2POnDl5tQQAkBuzEQD1KrdgobGxMZqamuLGG2+MNWvWxMKFC+Phhx+ObbbZJq+WAAByYzYCoF7lFiz06tUrpkyZEtdee23suOOO8YlPfCI++tGPxj//8z/n1RIAQG7MRgDUq1y/Y+Hpp5+OfffdN4466qh46qmnYurUqbHnnnvGIYcc0uEa5XI5SS9tdVLVa1ctpK2XWLlSTVuvFsuxiy/DiIhyuZKsVuVvy67SzZZhyh5rtT2n3l5qoUchTY8Nf6vTkKhem+T72IS6cm90Hylmo2JUI6Lzx6XX66Sr16arb2tJj79Rm+N6pdK1l2FERKWc7vjR9nhTPu5K4uNbLZQTvgVcq9ko9fZSCxs09kheK2XNahfentent0K1Ws1lq5ozZ06ceOKJce+990ZjY2NERFx00UVx8803xy9/+ct13r5cLsfcuXNr3CUA3c1OO+0UpVIp7zbohsxGAHRFHZmNcjtjYd68eTFkyJD2A2dExLbbbhsXX3zxetUZOnz7JANguVyOhU/OS1avTanYtd8prsUZC6mXY1dfhhERLa1pz1h45qk/xBbDtotiN1qGKXssl8vx1BOPxbBtRiTdnuvhjIWz7/xjkjoNhWocNnh1/PTPjdGa8GySMz++dbJaqbXtvyAvqWajuWs2jEp0frstRjV26rE0Wb02n995SLJatdCyJv07us8seDy22GrbZMf15c2tSerUUs9SurfbK5VyLF40PwZt+eEoFtMsw54NuX0ivMN69kg4w9RoNlq+ak2yWrWy7SdOTVZrg8YecdN3/yUOPfnaWLk6zWOfff3ZSerUQrVSjlUvLezQdXMLFjbZZJN49tlno6WlJXr27BkREQsXLozNNttsveqUSqW0QUDqel39BV2NTgNLuRy7/DKMiFINPmpQ7G7LsAY9pt6ea7W9pLQm8brYWi0krelMAHhnqWajShSikuRrtCqJ672uq+8HiuneK1i7bqmULFgoFrv+8aiYMFhor1lMuAxr0F9qtdhWUs9GxVKNNpiEUgUAb66Zqm4hUViWt9y2qLFjx0aPHj3i9NNPj0WLFsXdd98dF198cYwfPz6vlgAAcmM2AqBe5XbGQt++fePyyy+P73znO/G5z30uNtpoozjuuOPiX/7lX/JqCQAgN2YjAOpVrn8VYquttor/+I//yLMFAIAuw2wEQD3q+h8uAgAAALoswQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJk15N1AZ5WKhSgVC50vVC2krVcnkj9Wy7HzarAMu9Nz0d2d/fGtk9SplMvxzB8fi8ljt4piqZSkZkTEzqffkaxWak0NhZj12Y3zbgM67ZAPD0qy3VbK5Xj+6VeT1Wtz++MvJKtVC/sO2yTvFtapubWSdwvr9Nrq1mS1qpVyRES8sqIlCsU06+IWA3snqVNLzWvKyWpVyq/XallTjmLC1Sfl81wr9934nXTFqpWIVxfGHVdNiSikeY/+cz/6bZI6tdDYEPF//2mjDl3XGQsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJkJFgAAAIDMBAsAAABAZoIFAAAAIDPBAgAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQIAAACQmWABAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmTXk3UBW1Wo1IiLK5XKSem11UtXrrrrrcixXqulq1WIZVgvpatWBWq2HKZ/nWqmUK4nqlNf6bypNDV13XWz8W29txxeoN23rbqWSZrttq5OqXptCNc1+qlZS7/dqsT+tJn5OaqFaSfc8tz3elI+7HmbVlOtMrY7r9bAuRsp9TluthDUbu/Ar8rbeOjIbFap1OkG1tLTEY489lncbAPyDGTFiRPTs2TPvNmC9mY0AqIWOzEZ1GyxUKpVobW2NYrEYhULXfQcMgPpQrVajUqlEQ0NDFIs+KUj9MRsBkNL6zEZ1GywAAAAA+fOWDAAAAJCZYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLEdHc3ByTJ0+OkSNHxt577x2zZs3Ku6W68+KLL8YJJ5wQu+22W4wePTqmTZsWzc3NebdVtyZOnBinnHJK3m3UpZaWljj77LNj1KhRsddee8X5558f/qru+nnhhRfiy1/+cuyyyy4xduzYuPzyy/NuCXiPmY06z2yUltkoO7NR55mN1q0h7wa6gvPOOy/mzZsXV1xxRSxevDgmTZoUgwYNigMPPDDv1upCtVqNE044Ifr16xdXXXVVLFu2LCZPnhzFYjEmTZqUd3t159Zbb4177703Pv3pT+fdSl369re/HQ888EBcdtllsWLFijjppJNi0KBBMW7cuLxbqxsnnnhiDBo0KG688cZYsGBBnHzyyTF48OD42Mc+lndrwHvEbNQ5ZqO0zEadYzbqPLPRunX7MxZWrlwZ1113XZx22mmx3Xbbxcc+9rH413/917jqqqvybq1uLFy4MObOnRvTpk2LYcOGxciRI+OEE06IX/ziF3m3VneWLl0a5513XowYMSLvVurS0qVL44YbboipU6fGDjvsEHvuuWccffTR8eijj+bdWt1YtmxZzJ07N4477rjYYostYv/994/Ro0fHnDlz8m4NeI+YjTrPbJSO2ahzzEadZzbqmG4fLMyfPz9aW1tj5513bv/drrvuGo8++mhUKpUcO6sfAwcOjEsvvTQ23njjtX6/fPnynDqqX9OnT49PfepTsdVWW+XdSl166KGHok+fPrHbbru1/27ixIkxbdq0HLuqL42NjdHU1BQ33nhjrFmzJhYuXBgPP/xwbLPNNnm3BrxHzEadZzZKx2zUOWajzjMbdUy3DxaWLFkS73vf+6Jnz57tv9t4442jubk5li5dml9jdaRfv34xevTo9p8rlUpceeWVsccee+TYVf2ZM2dOPPjgg/GVr3wl71bq1p/+9KcYPHhw3HTTTXHggQfGfvvtFz/60Y8MwuuhV69eMWXKlLj22mtjxx13jE984hPx0Y9+NP75n/8579aA94jZqPPMRmmYjTrPbNR5ZqOO6fbfsbBq1aq1DpwR0f5zS0tLHi3VvRkzZsTjjz8e119/fd6t1I3m5uY488wzY8qUKdHY2Jh3O3Vr5cqV8eyzz8Y111wT06ZNiyVLlsSUKVOiqakpjj766LzbqxtPP/107LvvvnHUUUfFU089FVOnTo0999wzDjnkkLxbA94DZqP0zEbrz2yUhtkoDbPRunX7YKFXr15vOUi2/Wwntv5mzJgRV1xxRXz/+9+PrbfeOu926sbMmTNj++23X+vdDdZfQ0NDLF++PL73ve/F4MGDIyJi8eLFcfXVVzt4dtCcOXPi+uuvj3vvvTcaGxtjxIgR8eKLL8ZFF13k4AndhNkoLbNRNmajNMxGnWc26phuHyy8//3vj1dffTVaW1ujoeH1xbFkyZJobGyMfv365dxdfZk6dWpcffXVMWPGjDjggAPybqeu3HrrrfHyyy+3f561bYC744474pFHHsmztboycODA6NWrV/uBMyJiyy23jBdeeCHHrurLvHnzYsiQIWu9eNh2223j4osvzrEr4L1kNkrHbJSd2SgNs1HnmY06ptsHC9tss000NDTE3LlzY+TIkRHx+pecjBgxIorFbv8VFB02c+bMuOaaa+L888/3p6gy+MlPfhKtra3tP3/3u9+NiIiTTz45r5bq0o477hjNzc2xaNGi2HLLLSPi9W/mfuPBlHe3ySabxLPPPhstLS3tpz4vXLgwNttss5w7A94rZqM0zEadYzZKw2zUeWajjun2R4empqY49NBD46yzzorf//73cdddd8WsWbPiiCOOyLu1uvH000/HhRdeGMccc0zsuuuusWTJkvZ/dMzgwYNjyJAh7f969+4dvXv3jiFDhuTdWl0ZOnRojBkzJk499dSYP39+3HfffXHJJZfE4YcfnndrdWPs2LHRo0ePOP3002PRokVx9913x8UXXxzjx4/PuzXgPWI26jyzUeeZjdIwG3We2ahjCtVqtZp3E3lbtWpVnHXWWXHnnXdGnz594ktf+lJMmDAh77bqxiWXXBLf+9733vayJ5988j3u5h/DKaecEhER5557bs6d1J/XXnstpk6dGr/61a+iqakpPv/5z8fxxx8fhUIh79bqxoIFC+I73/lO/P73v4+NNtoovvCFL8SRRx5pGUI3YjbqHLNRemaj7MxGnWc2WjfBAgAAAJBZt/8oBAAAAJCdYAEAAADITLAAAAAAZCZYAAAAADITLAAAAACZCRYAAACAzAQLAAAAQGaCBQAAACAzwQLkYOzYsTF8+PD2f9ttt10ceOCBcfnllye7j/Hjx8cFF1wQERGnnHJKnHLKKeu8TUtLS/z0pz/NfJ833nhjjB07NvPtAYDuyWwE9a0h7wagu5o8eXIcdNBBERHR2toa//3f/x2nnXZabLjhhnHooYcmva/TTjutQ9e79dZb4+KLL47DDjss6f0DAKyL2QjqlzMWICd9+/aNgQMHxsCBA2PTTTeNT3/607HnnnvGnXfeWZP76tu37zqvV61Wk983AEBHmI2gfgkWoAtpaGiIHj16xPjx42Pq1Kmx3377xZgxY2L58uXxwgsvxLHHHhs77rhjjB07NmbOnBnlcrn9tr/61a/igAMOiJ122im+9a1vrXXZm0/3+/nPfx4HHnhg7LjjjjFu3Lh4/PHH44EHHohTTz01/vznP8fw4cPj+eefj2q1Gj/60Y9i7733jpEjR8axxx4bixcvbq/z4osvxr/+67/GTjvtFJ/+9Kfjueeee28WFADQLZiNoD4IFqALWLNmTdx5551x//33x3777RcRr38mb8aMGTFz5szo3bt3fPWrX40BAwbEz372s5g2bVrccsstcfHFF0dExIIFC+LEE0+Mww8/PG644YZobW2Nhx566G3v67777ovTTjstjjzyyLj55ptj++23jy9/+cux8847x+TJk+MDH/hAzJ49OzbddNO48sor45Zbbonvfe97ce2118aAAQPi6KOPjjVr1kRExL/9279FpVKJ6667Lo455pi44oor3psFBgD8QzMbQX3xHQuQkzPPPDOmTp0aERGrV6+OxsbGOPLII+OQQw6J6667LsaMGRO77LJLRETMmTMnFi9eHNddd10Ui8UYOnRoTJo0KU499dQ4/vjj44YbboiRI0fGhAkTIiLijDPOiHvuuedt7/faa6+Ngw8+OA4//PCIiPjmN78ZPXr0iGXLlkXfvn2jVCrFwIEDIyLi0ksvjTPPPDN23333iIj41re+FXvvvXfcd9998cEPfjAeeeSRuOeee2LQoEExbNiwmDdvXtx+++21XGwAwD8osxHUL8EC5OSEE06Ij3/84xER0atXrxg4cGCUSqX2ywcPHtz+/08//XQsXbo0dt111/bfVSqVWL16dbz66qvx9NNPxzbbbNN+WY8ePdb6+Y0WLVoU48aNa/+5Z8+eMWnSpLdcb8WKFfGXv/wlTjrppCgW/35y0+rVq+OZZ56J5ubm2HDDDWPQoEHtl40YMcLBEwDIxGwE9UuwADkZMGBADBky5B0v79WrV/v/t7a2xtChQ+PCCy98y/XavnjozV8u1KNHj7et29DQsc2+7XOI/+f//J/Ycsst17qsf//+MWfOnA7fJwDAupiNoH75jgWoA1tuuWUsXrw4NtpooxgyZEgMGTIknn/++fjhD38YhUIhhg0bFo899lj79SuVSsyfP/9taw0ZMmSty8rlcowdOzYeeuihKBQK7b/v169fDBgwIJYsWdJ+n5tuumnMmDEjFi1aFFtvvXUsW7Ysnn322fbbPPHEEzV49AAAazMbQdciWIA6sPfee8fgwYPjG9/4Rjz55JPx4IMPxhlnnBFNTU1RKpXisMMOi3nz5sVFF10UCxcujOnTp6/1DcVvNH78+Lj55pvjZz/7WTz77LMxbdq0qFarsd1220VTU1MsW7YsnnnmmWhtbY0JEybED37wg7j77rvjmWeeidNPPz0efvjhGDp0aHzoQx+KPffcMyZPnhzz58+Pu+66K6688sr3eMkAAN2R2Qi6FsEC1IFSqRQXXXRRVCqVOOyww+JrX/ta7LPPPnH66adHxOtJ+0UXXRS33nprHHroobFkyZLYZ5993rbWqFGj4swzz4wf/ehHccghh8QTTzwRF198cTQ2NsYee+wRQ4YMiX/6p3+KJ554Ir70pS/F5z73uZgyZUoceuihsXjx4rjsssuif//+ERHx/e9/P973vvfFuHHj4vzzz4/x48e/Z8sEAOi+zEbQtRSqb/4gEAAAAEAHOWMBAAAAyEywAAAAAGQmWAAAAAAyEywAAAAAmQkWAAAAgMwECwAAAEBmggUAAAAgM8ECAAAAkJlgAQAAAMhMsAAAAABkJlgAAAAAMhMsAAAAAJn9fydj0GYwG5KDAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 5
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
